package com.wang.springbootinit.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wang.springbootinit.common.ErrorCode;
import com.wang.springbootinit.exception.BusinessException;
import com.wang.springbootinit.mapper.NoticeMapper;
import com.wang.springbootinit.model.dto.NoticeQueryDTO;
import com.wang.springbootinit.model.entity.Notice;
import com.wang.springbootinit.service.NoticeService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

/**
 * 通知公告服务实现类
 * 提供通知公告的增删改查等基础业务功能
 */
@Service
@Slf4j
public class NoticeServiceImpl extends ServiceImpl<NoticeMapper, Notice> implements NoticeService {
    @Autowired
    private NoticeMapper noticeMapper;

    /**
     * 添加新的通知公告
     * @param notice 通知公告实体
     * @return 添加是否成功
     * @throws BusinessException 添加失败时抛出业务异常
     */
    @Override
    public boolean addNotice(Notice notice) {
        notice.setCreateTime(LocalDateTime.now());
        notice.setUpdateTime(LocalDateTime.now());
        notice.setStatus(0);
        notice.setIsDeleted(0);
        int insert = noticeMapper.insert(notice);
        if (insert > 0) {
            return true;
        }
        throw new BusinessException("添加失败");
    }

    /**
     * 更新通知公告信息
     * @param notice 需要更新的通知公告信息
     * @return 更新是否成功
     */
    @Override
    public boolean updateNotice(Notice notice) {
        if(ObjectUtil.isNull(notice) || ObjectUtil.isNull(notice.getNoticeId())){
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
        LambdaUpdateWrapper<Notice> queryWrapper = new LambdaUpdateWrapper<>();
        if(StringUtils.isNotBlank(notice.getNoticeTitle())){
            queryWrapper.set(Notice::getNoticeTitle,notice.getNoticeTitle());
        }
        if(StringUtils.isNotBlank(notice.getNoticeContent())){
            queryWrapper.set(Notice::getNoticeContent,notice.getNoticeContent());
        }
        queryWrapper.eq(Notice::getNoticeId,notice.getNoticeId());
        queryWrapper.eq(Notice::getIsDeleted,0);
        return update(queryWrapper);
    }

    /**
     * 删除指定通知公告
     * @param noticeId 通知公告ID
     * @return 删除是否成功
     */
    @Override
    public boolean deleteNotice(Long noticeId) {
        if(ObjectUtil.isNull(noticeId)){
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
        Notice notice = getById(noticeId);
        if(ObjectUtil.isNull(notice)){
            throw new BusinessException(ErrorCode.NOT_FOUND_ERROR);
        }
        return removeById(noticeId);
    }

    /**
     * 根据ID获取通知公告详情
     * @param noticeId 通知公告ID
     * @return 通知公告实体
     */
    @Override
    public Notice getNoticeById(Long noticeId) {
        if(ObjectUtil.isNull(noticeId)){
            throw new BusinessException(ErrorCode.PARAMS_ERROR);
        }
        Notice notice = getById(noticeId);
        if(ObjectUtil.isNull(notice)){
            throw new BusinessException(ErrorCode.NOT_FOUND_ERROR);
        }
        return notice;
    }

    /**
     * 分页查询通知公告列表
     * @param queryDTO 查询条件，包含：
     *                - 通知标题（模糊查询）
     *                - 通知类型
     *                - 开始时间
     *                - 结束时间
     *                - 分页参数（当前页码、每页大小）
     * @return 分页后的通知公告列表
     */
    @Override
    public Page<Notice> getNoticePage(NoticeQueryDTO queryDTO) {
        LambdaQueryWrapper<Notice> wrapper = new LambdaQueryWrapper<>();
        wrapper.like(StringUtils.isNotBlank(queryDTO.getNoticeTitle()), 
                    Notice::getNoticeTitle, queryDTO.getNoticeTitle())
               .eq(queryDTO.getStatus() != null,
                   Notice::getStatus, queryDTO.getStatus())
               .ge(queryDTO.getStartTime() != null, 
                   Notice::getCreateTime, queryDTO.getStartTime())
               .le(queryDTO.getEndTime() != null, 
                   Notice::getCreateTime, queryDTO.getEndTime())
               .eq(Notice::getIsDeleted, 0)
               .orderByDesc(Notice::getCreateTime);

        Page<Notice> page = new Page<>(queryDTO.getCurrent(), queryDTO.getPageSize());
        Page<Notice> noticePage = noticeMapper.selectPage(page, wrapper);
        return noticePage;
    }
    
    // 其他方法实现...
} 